# Databricks notebook source
# MAGIC %md
# MAGIC 
# MAGIC # 机器学习库（MLlib）
# MAGIC 
# MAGIC MLlib是Spark的机器学习（ML）库。旨在简化机器学习的工程实践工作，并方便扩展到更大规模。MLlib由一些通用的学习算法和工具组成，包括分类、回归、聚类、协同过滤、降维等，同时还包括底层的优化原语和高层的管道API。
# MAGIC 
# MAGIC MLllib目前分为两个代码包：
# MAGIC 
# MAGIC * `spark.mllib` 包含基于RDD的原始算法API。
# MAGIC   * **从Spark 2.0开始，基于RDD的API已进入维护模式**。
# MAGIC   * MLlib仍将支持基于RDD的API以及修复错误。
# MAGIC   * MLlib不会向基于RDD的API添加新功能。
# MAGIC * `spark.ml` 则提供了基于DataFrames高层次的API，可以用来构建机器学习管道。
# MAGIC   * DataFrames提供了比RDD更用户友好的API。DataFrames的许多好处包括Spark数据源，SQL/DataFrame查询，Catalyst优化以及跨语言的统一API。
# MAGIC   * MLlib的基于DataFrame的API提供了跨ML算法和多种语言的统一API。
# MAGIC   * DataFrames有助于实用的ML管道，尤其是转换功能。

# COMMAND ----------

# MAGIC %md
# MAGIC 
# MAGIC ## 依赖项
# MAGIC 
# MAGIC MLlib使用的线性代数代码包是Breeze，而Breeze又依赖于netlib-java优化的数值处理。如果在运行时环境中这些原生库不可用，你将会收到一条警告，而后Spark会使用纯JVM实现来替代之。
# MAGIC 
# MAGIC > WARN BLAS: Failed to load implementation from:dev.ludovic.netlib.blas.JNIBLAS

# COMMAND ----------

# MAGIC %md
# MAGIC 
# MAGIC # 基于DataFrames的高层次API

# COMMAND ----------

# MAGIC %md
# MAGIC 
# MAGIC ## 数据源
# MAGIC 
# MAGIC 除了常规的数据源，比如：Parquet，CSV，JSON和JDBC，Spark MLlib还支持一些其他特殊的数据源。

# COMMAND ----------

# MAGIC %md
# MAGIC 
# MAGIC ### Image数据源
# MAGIC 
# MAGIC Image数据源用于从一个指定的路径下加载图像文件，它可以通过Java库中的ImageIO将压缩图像（jpeg、png等）加载到原始图像表示中。加载的DataFrame有一个StructType列：“image”，其中包含作为图像数据存储的图像Schema。
# MAGIC 
# MAGIC * origin: StringType (表示图像的文件路径)
# MAGIC * height: IntegerType (图像高度)
# MAGIC * width: IntegerType (图像宽度)
# MAGIC * nChannels: IntegerType (图像通道数)
# MAGIC * mode: IntegerType (OpenCV兼容类型)
# MAGIC * data: BinaryType (图像字节按OpenCV兼容顺序排列：在大多数情况下为逐行BGR)

# COMMAND ----------

df = spark.read.format("image").option("dropInvalid", True).load("/mnt/databrickscontainer1/images")
df.select("image.origin", "image.width", "image.height").show(truncate=False)
